package DataStructure.symbol;

public class SymbolTable<Key,Value> {
    private Node head;
    private int N;


    public SymbolTable(){
        this.head=new Node(null,null,null);
        this.N=0;
    }

    public int size(){
        return N;
    }

    //往符号表中插入键值对
    public void put(Key key,Value value){
        //符合表中已经存在键为key的对，则替换
        Node n=head;
        while (n.next!=null){
            n=n.next;
            if(n.key.equals(key)){
                n.value=value;
                return;
            }
        }
        //如果不存在，只需创建新节点保存键值对，把新节点插入到链表的头部
        Node newnode = new Node(key,value,null);
        //将新节点插入到头部和第一个结点之间
        Node oldfirst=head.next;
        newnode.next=oldfirst;
        head.next=newnode;
        N++;
    }


    //删除键为key的结点，然后删除
    public void delete(Key key){
        Node n=head;//记录每一次遍历的结点
        while (n.next!=null){
            //判断n结点的下一个结点的key是否为key,如果是就删除
            if(n.next.key.equals(key)){
                n.next=n.next.next;
                N--;
                return;
            }
            n=n.next;
        }

    }



    //找到key对应的值
    public Value get(Key key){
        Node n=head;
        while (n.next!=null){
            n=n.next;
            if(n.key.equals(key)){
                return n.value;
            }
        }
        return null;
    }


    private class Node{
        public Key key;
        public Value value;
        public Node next;

        public Node(Key key,Value value,Node next){
            this.key=key;
            this.value=value;
            this.next=next;
        }
    }
}
